"""
需求：
    存储数据的位置： 文件（student.data）
        加载文件数据
        修改数据后保存在文件
    存储数据的形式：列表存储学员对象
    系统功能
        添加学员
        删除学员
        修改学员
        查询学员信息
        显示所有学员信息
        保存学员信息

"""
from student import *

class StudentManager(object):
    def __init__(self):
        # 存储数据所用的列表
        self.student_list = []

    # 一、程序入口函数，启动程序后执行的函数
    def run(self):
        # 1 加载学员信息
        self.load_student()

        while True:
            #2 显示功能菜单
            self.show_menu()

            #3 用户输入功能序号
            menu_num = int(input("请输入您需要的功能序号:"))

            #4 根据用户输入的功能序号执行不同的功能
            if menu_num == 1:
                #添加学员
                self.add_student()
            elif menu_num == 2:
                #删除学员
                self.del_student()
            elif menu_num == 3:
                #修改学员信息
                self.modify_student()
            elif menu_num == 4:
                # 查询学员信息
                self.search_student()
            elif menu_num == 5:
                # 显示所有学员信息
                self.show_student()
            elif menu_num == 6:
                # 保存学员信息
                self.save_student()
            elif menu_num == 7:
                # 退出系统
                break

    # 二 系统功能函数
    # 2.1 显示功能菜单 -- 打印序号的功能对应关系 -- 静态
    @staticmethod
    def show_menu():
        print('请选择如下功能：')
        print('1:添加学员',end='\t')
        print('2:删除学员',end='\t')
        print('3:修改学员',end='\t')
        print('4:查询学员',end='\t')
        print('5:显示学员',end='\t')
        print('6:保存学员',end='\t')
        print('7:退出系统')
    # 2.2 添加学员
    def add_student(self):
        name = input('请输入你的姓名：')
        gender = input('请输入你的性别：')
        tel = input('请输入你的手机号：')
        # 2 创建学员对象 -- 类？ 类在student文件中，先导入student模块，再创建对象
        student = Student(name,gender,tel)
        # 3 将该对象添加到学员列表
        self.student_list.append(student)
        print(student)

    # 2.3 删除学员
    def del_student(self):
        del_name = input('请输入你要删除的学员姓名：')
        for i in self.student_list:
            if i.name == del_name:
                self.student_list.remove(i)
                print('学员删除成功！')
                break
        else:
            print('查无此人')

        #打印列表，验证删除功能
        print(self.student_list)

    # 2.4 修改学员信息
    def modify_student(self):
        # 1 用户输入目标学员姓名：
        modify_name = input('请输入要修改的学员姓名：')
        for i in self.student_list:
            if i.name == modify_name:
                i.name = input('请输入新的学员姓名：')
                i.gender = input('请输入新的学员性别：')
                i.tel = input('请输入新的学员手机号：')
                print(f'修改后学员的姓名：{i.name},性别：{i.gender},手机号：{i.tel}')
                break
        else:
            print('查无此人')
    #2.5 查询学员信息
    def search_student(self):
        # 1 用户输入目标学员姓名
        search_name = input('请输入要查询的学员姓名：')

        # 2 如果用户存在，则打印学员信息
        for i in self.student_list:
            if i.name == search_name:
                print(f'查询的学员信息 姓名：{i.name}，性别：{i.gender},手机号：{i.tel}')
                break
        else:
            print('查无此人')

    #2.6 显示学员信息
    def show_student(self):
        print('查询到的所有学员信息如下：')
        if self.student_list ==[]:
            print('没有学员信息！')
        else:
            for i in self.student_list:
                print(f'姓名：{i.name}\t,性别：{i.gender}\t,手机号：{i.tel}')
    #2.7 保存学员信息

    # 文件写入的数据是学员对象的内存地址吗？
    # 文件内数据要求得数据类型是什么？
    #拓展 __dict__
    def save_student(self):
        # 1 打开文件
        f = open('student.data','w')

        # 2 文件写入学员数据
        # 注意1：文件写入的数据不能是学员对象的内存地址，需要把学员数据转换为列表字典数据再做存储
        new_list = [i.__dict__ for i in self.student_list]
        # [{'name':'aa','gender':'nv','tel':'111'}]
        print(new_list)

        # 注意2：文件内数据要求为字符串类型，故需要先转换数据类型为字符串才能文件写入数据
        f.write(str(new_list))

        # 3 关闭文件
        f.close()
    #2.8 加载学员信息
    def load_student(self):
        # 尝试以‘r’模式打开数据文件，文件不存在则提示用户：文件存在（没有异常）则读取数据
        print('加载学员信息')
        try:
            f = open('student.data','r')
        except:
            f = open('student.data','w')
        else:
            # 1 读取数据
            data = f.read()
            # 2 文件中读取的数据都是字符串且字符串内部为字典数据，故需要转换数据类型再转换字典为对象后存储到学员列表
            new_list = eval(data)

            self.student_list = [Student(i['name'],i['gender'],i['tel']) for i in new_list]
        finally:
            # 3 关闭文件
            f.close()